package com.teng.mrliuproject

import android.annotation.SuppressLint
import android.app.Application
import com.alibaba.android.arouter.BuildConfig
import com.alibaba.android.arouter.launcher.ARouter
import com.hjq.toast.ToastUtils
import com.tencent.mmkv.MMKV
import com.teng.mylibrary.net.RetrofitHelper
import com.teng.mylibrary.util.SPUtil
import com.teng.mylibrary.util.update.UpdateAppUtil

import cat.ereza.customactivityoncrash.config.CaocConfig
import cat.ereza.customactivityoncrash.CustomActivityOnCrash

import cat.ereza.customactivityoncrash.activity.DefaultErrorActivity

import com.teng.mrliuproject.ui.activity.MainActivity
import com.teng.mylibrary.ui.activity.CrashActivity


/**
 * Description:
 * Author:       liuteng
 * CreateDate:   2022/2/22 9:06
 * UpdateRemark: 更新说明
 */
class MyApp : Application() {

    override fun onCreate() {
        super.onCreate()
        ToastUtils.init(this)
        MMKV.initialize(this)
        initCrash()
        RetrofitHelper.init(this, SPUtil.getIp())
        //版本更新初始化
        UpdateAppUtil.initUpdateConfig(this)
        //初始化阿里路由框架
        if (BuildConfig.DEBUG) {
            // 打印日志
            ARouter.openLog()
            // 开启调试模式(如果在InstantRun模式下运行，必须开启调试模式！线上版本需要关闭,否则有安全风险)
            ARouter.openDebug()
        }
        ARouter.init(this)
    }

    @SuppressLint("RestrictedApi")
    private fun initCrash() {
        //整个配置属性，可以设置一个或多个，也可以一个都不设置
        //整个配置属性，可以设置一个或多个，也可以一个都不设置
        CaocConfig.Builder.create() //程序在后台时，发生崩溃的三种处理方式
            //BackgroundMode.BACKGROUND_MODE_SHOW_CUSTOM: //当应用程序处于后台时崩溃，也会启动错误页面，
            //BackgroundMode.BACKGROUND_MODE_CRASH:      //当应用程序处于后台崩溃时显示默认系统错误（一个系统提示的错误对话框），
            //BackgroundMode.BACKGROUND_MODE_SILENT:     //当应用程序处于后台时崩溃，默默地关闭程序！这种模式我感觉最好
            .backgroundMode(CaocConfig.BACKGROUND_MODE_SILENT)
            .enabled(true) //这阻止了对崩溃的拦截,false表示阻止。用它来禁用customactivityoncrash框架
            .showErrorDetails(true) //这将隐藏错误活动中的“错误详细信息”按钮，从而隐藏堆栈跟踪。
            .showRestartButton(true) //是否可以重启页面
            .trackActivities(true) //错误页面中显示错误详细信息
            .minTimeBetweenCrashesMs(2000) //定义应用程序崩溃之间的最短时间，以确定我们不在崩溃循环中。比如：在规定的时间内再次崩溃，框架将不处理，让系统处理！
            .errorDrawable(R.drawable.ic_crash) //崩溃页面显示的图标
            .restartActivity(MainActivity::class.java) //重新启动后的页面
//            .errorActivity(DefaultErrorActivity::class.java) //程序崩溃后显示的页面
            .errorActivity(CrashActivity::class.java) //程序崩溃后显示的页面
            .eventListener(CustomEventListener()) //设置监听
            .apply()
        //如果没有任何配置，程序崩溃显示的是默认的设置
        CustomActivityOnCrash.install(this)
    }

    /**
     * 监听程序崩溃/重启
     */
    private class CustomEventListener : CustomActivityOnCrash.EventListener {
        //程序崩溃回调
        override fun onLaunchErrorActivity() {
        }

        //重启程序时回调
        override fun onRestartAppFromErrorActivity() {
        }

        //在崩溃提示页面关闭程序时回调
        override fun onCloseAppFromErrorActivity() {
        }
    }

    override fun onTerminate() {
        super.onTerminate()
        ARouter.getInstance().destroy()
    }

}